#!/bin/bash
# deploy_code_server.sh - 纯Shell脚本部署code-server（含更新和检测功能）

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

# 输出彩色信息
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
log_debug() { echo -e "${BLUE}[DEBUG]${NC} $1"; }
log_status() { echo -e "${CYAN}[STATUS]${NC} $1"; }

# 常量定义
CODE_SERVER_DIR="/opt/code-server"
CONFIG_DIR="$CODE_SERVER_DIR/config"
SERVICE_FILE="/etc/systemd/system/code-server.service"
CONFIG_FILE="$CONFIG_DIR/config.yaml"

# 脚本内部变量（避免与系统变量冲突）
_CODE_SERVER_PORT="8080"
_CODE_SERVER_PASSWORD=""
_CODE_SERVER_WORK_DIR=""
_CODE_SERVER_VERSION=""
_CODE_SERVER_USER_NAME=$(whoami)
_CODE_SERVER_BIND_ADDR="0.0.0.0"
_INSTALL_SERVICE="yes"
_INSTALL_DEPS="yes"
_CONFIGURE_FIREWALL="yes"
_UPDATE_ACTION="no"

# 显示使用说明
usage() {
    cat << EOF
使用说明: $0 [选项]

部署选项:
    -h, --help          显示此帮助信息
    -p, --port PORT     code-server端口 (默认: 8080)
    -P, --password PWD  访问密码 (默认: 随机生成)
    -d, --dir DIR       工作目录 (默认: \$HOME/code-workspace)
    -v, --version VER   code-server版本 (默认: 最新版本)
    -u, --user USER     运行用户 (默认: 当前用户)
    --bind-addr ADDR    绑定地址 (默认: 0.0.0.0)
    --no-service        不安装systemd服务
    --skip-deps         跳过依赖安装
    --skip-firewall     跳过防火墙配置

管理选项:
    --update            更新code-server到最新版本
    --update-version V  更新到指定版本
    --status            检查code-server状态
    --info              显示部署信息
    --stop              停止code-server服务
    --start             启动code-server服务
    --restart           重启code-server服务
    --uninstall         卸载code-server
    --logs              查看服务日志

示例:
    # 部署（自动下载最新版本）
    $0 -p 8888 -P mypassword
    $0 --port 8080 --dir /opt/workspace --user developer
    
    # 部署指定版本
    $0 -v 4.24.0 -p 8080
    
    # 管理
    $0 --status
    $0 --update
    $0 --update-version 4.24.0
    $0 --uninstall
EOF
}

# 解析命令行参数
parse_arguments() {
    while [[ $# -gt 0 ]]; do
        case $1 in
            -h|--help)
                usage
                exit 0
                ;;
            -p|--port)
                _CODE_SERVER_PORT="$2"
                shift 2
                ;;
            -P|--password)
                _CODE_SERVER_PASSWORD="$2"
                shift 2
                ;;
            -d|--dir)
                _CODE_SERVER_WORK_DIR="$2"
                shift 2
                ;;
            -v|--version)
                _CODE_SERVER_VERSION="$2"
                shift 2
                ;;
            -u|--user)
                _CODE_SERVER_USER_NAME="$2"
                shift 2
                ;;
            --bind-addr)
                _CODE_SERVER_BIND_ADDR="$2"
                shift 2
                ;;
            --no-service)
                _INSTALL_SERVICE="no"
                shift
                ;;
            --skip-deps)
                _INSTALL_DEPS="no"
                shift
                ;;
            --skip-firewall)
                _CONFIGURE_FIREWALL="no"
                shift
                ;;
            --update)
                _UPDATE_ACTION="yes"
                _CODE_SERVER_VERSION="latest"
                shift
                ;;
            --update-version)
                _UPDATE_ACTION="yes"
                _CODE_SERVER_VERSION="$2"
                shift 2
                ;;
            --status)
                check_deployment_status
                exit 0
                ;;
            --info)
                show_deployment_info_full
                exit 0
                ;;
            --stop)
                stop_code_server
                exit 0
                ;;
            --start)
                start_code_server
                exit 0
                ;;
            --restart)
                restart_code_server
                exit 0
                ;;
            --uninstall)
                uninstall_code_server
                exit 0
                ;;
            --logs)
                show_logs
                exit 0
                ;;
            *)
                log_error "未知参数: $1"
                usage
                exit 1
                ;;
        esac
    done
}

# 获取最新版本号
get_latest_version() {
    log_info "正在获取最新版本号..."
    local latest_version
    latest_version=$(curl -s https://api.github.com/repos/coder/code-server/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/' || echo "")
    
    if [ -z "$latest_version" ]; then
        log_error "无法获取最新版本号，请检查网络连接"
        exit 1
    fi
    
    echo "$latest_version"
}

# 验证版本号是否存在
validate_version() {
    local version="$1"
    log_info "验证版本 v$version 是否存在..."
    
    if ! curl -s -I "https://github.com/coder/code-server/releases/download/v$version/code-server-$version-linux-amd64.tar.gz" | head -n 1 | grep -q "200"; then
        log_error "版本 v$version 不存在或下载失败"
        return 1
    fi
    return 0
}

# 设置版本号
set_version() {
    if [ -z "$_CODE_SERVER_VERSION" ] || [ "$_CODE_SERVER_VERSION" = "latest" ]; then
        _CODE_SERVER_VERSION=$(get_latest_version)
        log_info "使用最新版本: v$_CODE_SERVER_VERSION"
    else
        if ! validate_version "$_CODE_SERVER_VERSION"; then
            log_error "指定的版本 v$_CODE_SERVER_VERSION 不可用"
            exit 1
        fi
        log_info "使用指定版本: v$_CODE_SERVER_VERSION"
    fi
}

# 检查code-server是否已部署
is_code_server_installed() {
    [ -f "/usr/local/bin/code-server" ] || [ -f "$CODE_SERVER_DIR/bin/code-server" ]
}

# 检查服务是否运行
is_service_running() {
    if [ "$_INSTALL_SERVICE" = "yes" ] && [ -f "$SERVICE_FILE" ]; then
        systemctl is-active --quiet code-server
    else
        # 检查进程
        pgrep -f "code-server.*$_CODE_SERVER_PORT" > /dev/null
    fi
}

# 获取当前安装的版本
get_installed_version() {
    if is_code_server_installed; then
        local version_output=""
        if [ -f "/usr/local/bin/code-server" ]; then
            version_output=$(/usr/local/bin/code-server --version 2>/dev/null | head -1 | awk '{print $1}' || echo "")
        elif [ -f "$CODE_SERVER_DIR/bin/code-server" ]; then
            version_output=$("$CODE_SERVER_DIR/bin/code-server" --version 2>/dev/null | head -1 | awk '{print $1}' || echo "")
        fi
        
        if [ -n "$version_output" ]; then
            echo "$version_output"
        else
            echo "未知版本"
        fi
    else
        echo "未安装"
    fi
}

# 检查部署状态
check_deployment_status() {
    log_status "=== code-server 部署状态检查 ==="
    
    echo
    log_status "安装状态:"
    if is_code_server_installed; then
        local installed_ver=$(get_installed_version)
        log_info "✅ 已安装 - 版本: $installed_ver"
        log_info "   安装路径: $CODE_SERVER_DIR"
        log_info "   二进制文件: $(which code-server 2>/dev/null || echo "$CODE_SERVER_DIR/bin/code-server")"
        
        # 显示最新版本信息
        local latest_ver=$(get_latest_version)
        if [ "$installed_ver" != "$latest_ver" ] && [ "$installed_ver" != "未知版本" ] && [ "$installed_ver" != "未安装" ]; then
            log_warn "   有新版本可用: $latest_ver (当前: $installed_ver)"
            log_info "   使用 $0 --update 更新到最新版本"
        fi
    else
        log_error "❌ 未安装"
    fi
    
    echo
    log_status "服务状态:"
    if [ -f "$SERVICE_FILE" ]; then
        log_info "✅ Systemd服务已配置"
        systemctl status code-server --no-pager -l | head -10
    else
        log_warn "⚠️  Systemd服务未配置"
    fi
    
    echo
    log_status "运行状态:"
    if is_service_running; then
        log_info "✅ 服务正在运行"
        local pid=$(pgrep -f "code-server.*$_CODE_SERVER_PORT")
        log_info "   进程PID: $pid"
        
        # 检查端口监听
        if ss -tlnp | grep -q ":$_CODE_SERVER_PORT "; then
            log_info "   端口 $_CODE_SERVER_PORT 监听正常"
        else
            log_warn "   端口 $_CODE_SERVER_PORT 未监听"
        fi
    else
        log_error "❌ 服务未运行"
    fi
    
    echo
    log_status "配置信息:"
    if [ -f "$CONFIG_FILE" ]; then
        log_info "✅ 配置文件: $CONFIG_FILE"
        echo "   配置内容:"
        grep -E '(bind-addr|auth|password|cert|user-data-dir|extensions-dir)' "$CONFIG_FILE" | sed 's/^/      /'
    else
        log_warn "⚠️  配置文件不存在"
    fi
    
    # 显示工作目录
    local work_dir_to_check="$_CODE_SERVER_WORK_DIR"
    if [ -z "$work_dir_to_check" ]; then
        work_dir_to_check="$(eval echo "\$HOME/code-workspace")"
    fi
    
    if [ -d "$work_dir_to_check" ]; then
        log_info "✅ 工作目录: $work_dir_to_check"
    else
        log_warn "⚠️  工作目录不存在: $work_dir_to_check"
    fi
}

# 显示完整部署信息
show_deployment_info_full() {
    local ip_address=$(hostname -I | awk '{print $1}')
    local installed_ver=$(get_installed_version)
    local password=$(grep 'password:' "$CONFIG_FILE" 2>/dev/null | awk '{print $2}' || echo "未配置")
    local work_dir_to_show="$_CODE_SERVER_WORK_DIR"
    
    if [ -z "$work_dir_to_show" ]; then
        work_dir_to_show="$(eval echo "\$HOME/code-workspace")"
    fi
    
    cat << EOF
$(log_status "=== code-server 部署信息 ===")

📋 基本信息:
   🌐 访问地址: http://${ip_address}:${_CODE_SERVER_PORT}
   🔑 访问密码: ${password}
   📁 工作目录: ${work_dir_to_show}
   👤 运行用户: ${_CODE_SERVER_USER_NAME}
   🏷️  当前版本: ${installed_ver}

🔧 管理命令:
   $0 --status          # 查看状态
   $0 --stop            # 停止服务
   $0 --start           # 启动服务
   $0 --restart         # 重启服务
   $0 --logs            # 查看日志
   $0 --update          # 更新到最新版本
   $0 --uninstall       # 卸载

📊 服务状态:
EOF

    if is_service_running; then
        log_info "   ✅ 服务运行中"
    else
        log_error "   ❌ 服务未运行"
    fi
}

# 停止服务
stop_code_server() {
    log_info "停止code-server服务..."
    
    if is_service_running; then
        if [ -f "$SERVICE_FILE" ]; then
            systemctl stop code-server
            log_info "服务已停止"
        else
            pkill -f "code-server.*$_CODE_SERVER_PORT" && log_info "进程已终止" || log_warn "无运行进程"
        fi
    else
        log_info "服务未运行"
    fi
}

# 启动服务
start_code_server() {
    log_info "启动code-server服务..."
    
    if [ -f "$SERVICE_FILE" ]; then
        systemctl start code-server
        if systemctl is-active --quiet code-server; then
            log_info "服务启动成功"
        else
            log_error "服务启动失败"
            systemctl status code-server --no-pager -l
        fi
    else
        log_error "Systemd服务未配置，请使用完整部署"
        exit 1
    fi
}

# 重启服务
restart_code_server() {
    log_info "重启code-server服务..."
    
    if [ -f "$SERVICE_FILE" ]; then
        systemctl restart code-server
        sleep 2
        if systemctl is-active --quiet code-server; then
            log_info "服务重启成功"
        else
            log_error "服务重启失败"
            systemctl status code-server --no-pager -l
        fi
    else
        log_error "Systemd服务未配置"
        exit 1
    fi
}

# 查看日志
show_logs() {
    if [ -f "$SERVICE_FILE" ]; then
        journalctl -u code-server -f
    else
        log_error "Systemd服务未配置，无法查看日志"
    fi
}

# 更新code-server
update_code_server() {
    log_status "开始更新code-server..."
    
    if ! is_code_server_installed; then
        log_error "code-server未安装，无法更新"
        exit 1
    fi
    
    local current_ver=$(get_installed_version)
    
    # 设置目标版本
    set_version
    
    local target_ver="$_CODE_SERVER_VERSION"
    
    log_info "当前版本: $current_ver"
    log_info "目标版本: $target_ver"
    
    if [ "$current_ver" = "$target_ver" ]; then
        log_info "当前已是最新版本，无需更新"
        return 0
    fi
    
    # 备份当前配置
    log_info "备份当前配置..."
    local backup_dir="/tmp/code-server-backup-$(date +%Y%m%d-%H%M%S)"
    mkdir -p "$backup_dir"
    cp -r "$CONFIG_DIR" "$backup_dir/" 2>/dev/null || true
    
    # 停止服务
    stop_code_server
    
    # 下载新版本
    log_info "下载新版本 v$target_ver..."
    local download_url="https://github.com/coder/code-server/releases/download/v$target_ver/code-server-$target_ver-linux-amd64.tar.gz"
    local temp_file="/tmp/code-server-$target_ver-linux-amd64.tar.gz"
    
    if ! curl -L -o "$temp_file" "$download_url"; then
        log_error "下载失败: $download_url"
        start_code_server
        exit 1
    fi
    
    # 备份旧版本
    local backup_path="$CODE_SERVER_DIR.bak.$(date +%Y%m%d-%H%M%S)"
    mv "$CODE_SERVER_DIR" "$backup_path"
    
    # 安装新版本
    log_info "安装新版本..."
    mkdir -p "$CODE_SERVER_DIR"
    tar xzf "$temp_file" -C "$CODE_SERVER_DIR" --strip-components=1
    ln -sf "$CODE_SERVER_DIR/bin/code-server" /usr/local/bin/code-server
    chown -R "$_CODE_SERVER_USER_NAME:$_CODE_SERVER_USER_NAME" "$CODE_SERVER_DIR"
    chmod +x "$CODE_SERVER_DIR/bin/code-server"
    
    # 恢复配置
    if [ -d "$backup_dir/config" ]; then
        cp -r "$backup_dir/config" "$CODE_SERVER_DIR/"
        log_info "配置恢复完成"
    fi
    
    # 清理临时文件
    rm -f "$temp_file"
    rm -rf "$backup_dir"
    
    # 启动服务
    start_code_server
    
    log_info "✅ code-server 更新完成: $current_ver → $target_ver"
    
    # 清理旧备份（保留最近3个）
    ls -dt "$CODE_SERVER_DIR.bak."* 2>/dev/null | tail -n +4 | xargs rm -rf 2>/dev/null || true
}

# 卸载code-server
uninstall_code_server() {
    log_status "开始卸载code-server..."
    
    if ! is_code_server_installed; then
        log_error "code-server未安装"
        exit 1
    fi
    
    read -p "确定要卸载code-server吗？这将删除所有数据！(y/N): " confirm
    if [[ ! $confirm =~ ^[Yy]$ ]]; then
        log_info "取消卸载"
        exit 0
    fi
    
    # 停止服务
    stop_code_server
    
    # 禁用服务
    if [ -f "$SERVICE_FILE" ]; then
        systemctl disable code-server
        rm -f "$SERVICE_FILE"
        systemctl daemon-reload
        log_info "Systemd服务已移除"
    fi
    
    # 删除文件
    rm -f /usr/local/bin/code-server
    rm -rf "$CODE_SERVER_DIR"
    
    log_info "✅ code-server 已完全卸载"
}

# 检测操作系统
detect_os() {
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        OS_NAME=$ID
        OS_VERSION=$VERSION_ID
    else
        log_error "无法检测操作系统"
        exit 1
    fi
    
    log_info "检测到操作系统: $OS_NAME $OS_VERSION"
}

# 检查权限
check_privileges() {
    if [ "$EUID" -ne 0 ] && [ "$_INSTALL_SERVICE" = "yes" ]; then
        log_error "需要root权限来安装系统服务"
        exit 1
    fi
}

# 生成随机密码
generate_password() {
    if [ -z "$_CODE_SERVER_PASSWORD" ]; then
        _CODE_SERVER_PASSWORD=$(openssl rand -base64 12 | tr -d '/+=' | cut -c1-12)
        log_info "生成随机密码: $_CODE_SERVER_PASSWORD"
    fi
}

# 设置工作目录
set_work_dir() {
    if [ -z "$_CODE_SERVER_WORK_DIR" ]; then
        _CODE_SERVER_WORK_DIR="$(eval echo "\$HOME/code-workspace")"
    fi
}

# 安装依赖
install_dependencies() {
    if [ "$_INSTALL_DEPS" = "no" ]; then
        log_info "跳过依赖安装"
        return 0
    fi

    log_info "安装系统依赖..."

    case $OS_NAME in
        ubuntu|debian)
            apt update
            apt install -y curl wget tar gzip git
            ;;
        centos|rhel|fedora)
            if command -v dnf &> /dev/null; then
                dnf install -y curl wget tar gzip git
            else
                yum install -y curl wget tar gzip git
            fi
            ;;
        *)
            log_warn "未知操作系统，请手动安装依赖: curl, wget, tar, gzip, git"
            ;;
    esac
}

# 创建用户和目录
setup_user_and_dirs() {
    log_info "设置用户和目录..."
    
    # 检查用户是否存在
    if ! id "$_CODE_SERVER_USER_NAME" &>/dev/null; then
        log_warn "用户 $_CODE_SERVER_USER_NAME 不存在，将创建该用户"
        useradd -m -s /bin/bash "$_CODE_SERVER_USER_NAME"
    fi
    
    # 创建工作目录
    mkdir -p "$_CODE_SERVER_WORK_DIR"
    chown -R "$_CODE_SERVER_USER_NAME:$_CODE_SERVER_USER_NAME" "$_CODE_SERVER_WORK_DIR"
    chmod 755 "$_CODE_SERVER_WORK_DIR"
    
    # 创建安装目录
    mkdir -p "$CODE_SERVER_DIR"
}

# 下载并安装code-server
install_code_server() {
    # 设置版本号
    set_version
    
    log_info "下载 code-server v$_CODE_SERVER_VERSION..."
    
    local download_url="https://github.com/coder/code-server/releases/download/v$_CODE_SERVER_VERSION/code-server-$_CODE_SERVER_VERSION-linux-amd64.tar.gz"
    local temp_file="/tmp/code-server-$_CODE_SERVER_VERSION-linux-amd64.tar.gz"
    
    # 下载
    if ! curl -L -o "$temp_file" "$download_url"; then
        log_error "下载失败: $download_url"
        exit 1
    fi
    
    log_info "解压安装..."
    tar xzf "$temp_file" -C "$CODE_SERVER_DIR" --strip-components=1
    
    # 创建符号链接
    ln -sf "$CODE_SERVER_DIR/bin/code-server" /usr/local/bin/code-server
    
    # 设置权限
    chown -R "$_CODE_SERVER_USER_NAME:$_CODE_SERVER_USER_NAME" "$CODE_SERVER_DIR"
    chmod +x "$CODE_SERVER_DIR/bin/code-server"
    
    # 清理临时文件
    rm -f "$temp_file"
}

# 创建配置文件
create_config() {
    log_info "创建配置文件..."
    
    mkdir -p "$CONFIG_DIR"
    
    cat > "$CONFIG_FILE" << EOF
bind-addr: $_CODE_SERVER_BIND_ADDR:$_CODE_SERVER_PORT
auth: password
password: $_CODE_SERVER_PASSWORD
cert: false
user-data-dir: $CODE_SERVER_DIR/data
extensions-dir: $CODE_SERVER_DIR/extensions
disable-telemetry: true
EOF

    chown -R "$_CODE_SERVER_USER_NAME:$_CODE_SERVER_USER_NAME" "$CONFIG_DIR"
}

# 安装systemd服务
install_systemd_service() {
    if [ "$_INSTALL_SERVICE" = "no" ]; then
        log_info "跳过systemd服务安装"
        return 0
    fi

    log_info "安装systemd服务..."
    
    cat > "$SERVICE_FILE" << EOF
[Unit]
Description=code-server
After=network.target

[Service]
Type=exec
ExecStart=/usr/local/bin/code-server --config $CONFIG_FILE "$_CODE_SERVER_WORK_DIR"
WorkingDirectory=$_CODE_SERVER_WORK_DIR
User=$_CODE_SERVER_USER_NAME
Group=$_CODE_SERVER_USER_NAME
Restart=always
RestartSec=3
Environment=HOME=$_CODE_SERVER_WORK_DIR

[Install]
WantedBy=multi-user.target
EOF

    # 重载systemd并启动服务
    systemctl daemon-reload
    systemctl enable code-server
    systemctl start code-server
    
    # 检查服务状态
    if systemctl is-active --quiet code-server; then
        log_info "code-server服务启动成功"
    else
        log_error "code-server服务启动失败"
        systemctl status code-server
        exit 1
    fi
}

# 配置防火墙
configure_firewall() {
    if [ "$_CONFIGURE_FIREWALL" = "no" ]; then
        log_info "跳过防火墙配置"
        return 0
    fi

    log_info "配置防火墙..."
    
    case $OS_NAME in
        ubuntu|debian)
            if command -v ufw &> /dev/null && ufw status | grep -q "active"; then
                ufw allow $_CODE_SERVER_PORT/tcp
                log_info "UFW防火墙已配置，端口 $_CODE_SERVER_PORT 已开放"
            fi
            ;;
        centos|rhel|fedora)
            if command -v firewall-cmd &> /dev/null; then
                firewall-cmd --permanent --add-port=$_CODE_SERVER_PORT/tcp
                firewall-cmd --reload
                log_info "FirewallD已配置，端口 $_CODE_SERVER_PORT 已开放"
            elif command -v iptables &> /dev/null; then
                iptables -I INPUT -p tcp --dport $_CODE_SERVER_PORT -j ACCEPT
                log_info "iptables已配置，端口 $_CODE_SERVER_PORT 已开放"
            fi
            ;;
    esac
}

# 健康检查
health_check() {
    log_info "进行健康检查..."
    
    sleep 5  # 等待服务启动
    
    local max_attempts=10
    local attempt=1
    
    while [ $attempt -le $max_attempts ]; do
        if curl -s -f "http://localhost:$_CODE_SERVER_PORT" > /dev/null; then
            log_info "✅ code-server 服务运行正常"
            return 0
        fi
        
        log_debug "检查尝试 $attempt/$max_attempts ..."
        sleep 3
        ((attempt++))
    done
    
    log_error "❌ code-server 服务健康检查失败"
    return 1
}

# 显示部署信息
show_deployment_info() {
    local ip_address=$(hostname -I | awk '{print $1}')
    
    cat << EOF

🎉 code-server 部署完成!

📋 访问信息:
   🌐 访问地址: http://${ip_address}:${_CODE_SERVER_PORT}
   🔑 访问密码: ${_CODE_SERVER_PASSWORD}
   📁 工作目录: ${_CODE_SERVER_WORK_DIR}
   👤 运行用户: ${_CODE_SERVER_USER_NAME}
   🏷️  版本: v${_CODE_SERVER_VERSION}

🔧 管理命令:
   $0 --status          # 查看状态
   $0 --stop            # 停止服务  
   $0 --start           # 启动服务
   $0 --restart         # 重启服务
   $0 --update          # 更新版本
   $0 --logs            # 查看日志

EOF
}

# 主函数
main() {
    # 检查是否是更新操作
    if [ "$_UPDATE_ACTION" = "yes" ]; then
        update_code_server
        exit 0
    fi
    
    # 检查是否已安装
    if is_code_server_installed; then
        local installed_ver=$(get_installed_version)
        log_warn "code-server 已安装，当前版本: $installed_ver"
        read -p "是否继续部署？这将覆盖现有安装。(y/N): " confirm
        if [[ ! $confirm =~ ^[Yy]$ ]]; then
            log_info "取消部署"
            exit 0
        fi
    fi
    
    log_info "开始部署 code-server..."
    
    # 显示部署配置
    cat << EOF
部署配置:
├── 端口: $_CODE_SERVER_PORT
├── 绑定地址: $_CODE_SERVER_BIND_ADDR
├── 用户: $_CODE_SERVER_USER_NAME
├── 工作目录: $_CODE_SERVER_WORK_DIR
├── 安装服务: $_INSTALL_SERVICE
├── 安装依赖: $_INSTALL_DEPS
└── 配置防火墙: $_CONFIGURE_FIREWALL
EOF

    # 执行部署步骤
    detect_os
    check_privileges
    generate_password
    set_work_dir
    install_dependencies
    setup_user_and_dirs
    install_code_server
    create_config
    
    if [ "$_INSTALL_SERVICE" = "yes" ]; then
        install_systemd_service
        health_check
    fi
    
    configure_firewall
    show_deployment_info
    
    log_info "✅ code-server 部署完成!"
}

# 脚本入口
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    # 解析参数
    parse_arguments "$@"
    
    # 如果没有参数，显示状态
    if [ $# -eq 0 ]; then
        check_deployment_status
    else
        main "$@"
    fi
fi
